作者:优优绿园之时尚饰品_834 | 来源:互联网 | 2023-07-28 17:52
篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java8时间和日期API相关的知识,希望对你有一定的参考价值。
时间和日期API(记录下来当成字典查用了)
旧版日期时间API存在的问题
-
设计很差:在java.util和java.sql的包中都有日期类,java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期。此外用于格式化和解析的类在java.text包中定义。
-
非线程安全: java.util.Date是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一。
-
时区处理麻烦:日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和
java.util.TimeZone类,但他们同样存在上述所有的问题。
新日期时间API介绍
JDK 8中增加了一套全新的日期时间API,这套API设计合理,是线程安全的。新的日期及时间API位于java.time包中,下面是一些关键类。
Loca1Date
:表示日期,包含年月日,格式为2019-10-16
LocalTime
:表示时间,包含时分秒,格式为16:38:54.158549300
LocalDateTime
:表示日期时间,包含年月日,时分秒,格式为2018-09-06T15:33:56.750
DateTimeFormatter
:日期时间格式化类。
lnstant
:时间戳,表示—个特定的时间瞬间。
Duration
:用于计算2个时间(LocalTime,时分秒)的距离Period:用于计算2个日期(LocalDate,年月日)的距离
ZonedDateTime
:包含时区的时间
掌握JDK 8的日期和时间类
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class Test01
public static void main(String[] args)
LocalDate now = LocalDate.now();
System.out.println(now);
System.out.println(now.getYear());
System.out.println(now.getMonthValue());
System.out.println(now.getDayOfMonth());
System.out.println(now.getDayOfWeek());
System.out.println(now.getDayOfYear());
LocalTime localTime =LocalTime.now();
System.out.println(localTime);
System.out.println(localTime.getNano());
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(dateTime);
System.out.println(dateTime.withYear(2000));
System.out.println(dateTime.plusYears(6));
System.out.println(dateTime.minusYears(6));
掌握JDK8的时间格式化与解析
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Test02
public static void main(String[] args)
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(dateTime);
DateTimeFormatter isoDate = DateTimeFormatter.ISO_LOCAL_DATE;
System.out.println(dateTime.format(isoDate));
String format="yyyy年MM月dd日 HH:mm:ss";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(format);
String timeString = dateTime.format(dtf);
System.out.println(timeString);
LocalDateTime parse = LocalDateTime.parse(timeString,dtf);
System.out.println(parse);
掌握JDK 8的Instant时间戳
instant内部保存了秒,一般不是给用户用的,而是方便我们程序做一些统计的
使用方法差不多,有加减、获取时分秒、毫秒、纳秒
了解JDK 8的计算日期时间差类
Duration、Period类。
package com.yong.time;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.Period;
public class Test03
public static void main(String[] args)
LocalTime now = LocalTime.now();
LocalTime time = LocalTime.of(11, 20, 30);
Duration duration = Duration.between(time, now);
System.out.println(duration);
System.out.println("相差的天数"+duration.toDays());
System.out.println("相差的小时数"+duration.toHours());
System.out.println("相差的分钟数"+duration.toMinutes());
System.out.println("相差的毫秒数"+duration.toMillis());
LocalDate now1 = LocalDate.now();
LocalDate date = LocalDate.of(11, 11, 11);
Period period = Period.between(date,now1);
System.out.println(period.getYears());
System.out.println(period.getMonths());
System.out.println(period.getDays());
了解JDK8设置日期时间的时区
Java8中加入了对时区的支持,LocalDate、LocalTime、LocalDateTime是不带时区的,带时区的日期时间类分别为: ZonedDate、ZonedTime、ZonedDateTime。
其中每个时区都对应着ID,ID的格式为“区域/城市”。例如:Asia/Shanghai 等。
zoneld:该类中包含了所有的时区信息。
import java.time.Clock;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Test04
public static void main(String[] args)
ZoneId.getAvailableZoneIds().forEach(System.out::println);
LocalDateTime now = LocalDateTime.now();
System.out.println(now);
ZonedDateTime dateTime = ZonedDateTime.now(Clock.systemUTC());
System.out.println(dateTime);
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println(zonedDateTime);
ZonedDateTime time = ZonedDateTime.now(ZoneId.of("America/Vancouver"));
System.out.println(time);